home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / swapops.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  3.5 KB  |  134 lines

  1. /*
  2.  * swapcache pages are stored in the swapper_space radix tree.  We want to
  3.  * get good packing density in that tree, so the index should be dense in
  4.  * the low-order bits.
  5.  *
  6.  * We arrange the `type' and `offset' fields so that `type' is at the five
  7.  * high-order bits of the swp_entry_t and `offset' is right-aligned in the
  8.  * remaining bits.
  9.  *
  10.  * swp_entry_t's are *never* stored anywhere in their arch-dependent format.
  11.  */
  12. #define SWP_TYPE_SHIFT(e)    (sizeof(e.val) * 8 - MAX_SWAPFILES_SHIFT)
  13. #define SWP_OFFSET_MASK(e)    ((1UL << SWP_TYPE_SHIFT(e)) - 1)
  14.  
  15. /*
  16.  * Store a type+offset into a swp_entry_t in an arch-independent format
  17.  */
  18. static inline swp_entry_t swp_entry(unsigned long type, pgoff_t offset)
  19. {
  20.     swp_entry_t ret;
  21.  
  22.     ret.val = (type << SWP_TYPE_SHIFT(ret)) |
  23.             (offset & SWP_OFFSET_MASK(ret));
  24.     return ret;
  25. }
  26.  
  27. /*
  28.  * Extract the `type' field from a swp_entry_t.  The swp_entry_t is in
  29.  * arch-independent format
  30.  */
  31. static inline unsigned swp_type(swp_entry_t entry)
  32. {
  33.     return (entry.val >> SWP_TYPE_SHIFT(entry));
  34. }
  35.  
  36. /*
  37.  * Extract the `offset' field from a swp_entry_t.  The swp_entry_t is in
  38.  * arch-independent format
  39.  */
  40. static inline pgoff_t swp_offset(swp_entry_t entry)
  41. {
  42.     return entry.val & SWP_OFFSET_MASK(entry);
  43. }
  44.  
  45. #ifdef CONFIG_MMU
  46. /* check whether a pte points to a swap entry */
  47. static inline int is_swap_pte(pte_t pte)
  48. {
  49.     return !pte_none(pte) && !pte_present(pte) && !pte_file(pte);
  50. }
  51. #endif
  52.  
  53. /*
  54.  * Convert the arch-dependent pte representation of a swp_entry_t into an
  55.  * arch-independent swp_entry_t.
  56.  */
  57. static inline swp_entry_t pte_to_swp_entry(pte_t pte)
  58. {
  59.     swp_entry_t arch_entry;
  60.  
  61.     BUG_ON(pte_file(pte));
  62.     arch_entry = __pte_to_swp_entry(pte);
  63.     return swp_entry(__swp_type(arch_entry), __swp_offset(arch_entry));
  64. }
  65.  
  66. /*
  67.  * Convert the arch-independent representation of a swp_entry_t into the
  68.  * arch-dependent pte representation.
  69.  */
  70. static inline pte_t swp_entry_to_pte(swp_entry_t entry)
  71. {
  72.     swp_entry_t arch_entry;
  73.  
  74.     arch_entry = __swp_entry(swp_type(entry), swp_offset(entry));
  75.     BUG_ON(pte_file(__swp_entry_to_pte(arch_entry)));
  76.     return __swp_entry_to_pte(arch_entry);
  77. }
  78.  
  79. #ifdef CONFIG_MIGRATION
  80. static inline swp_entry_t make_migration_entry(struct page *page, int write)
  81. {
  82.     BUG_ON(!PageLocked(page));
  83.     return swp_entry(write ? SWP_MIGRATION_WRITE : SWP_MIGRATION_READ,
  84.             page_to_pfn(page));
  85. }
  86.  
  87. static inline int is_migration_entry(swp_entry_t entry)
  88. {
  89.     return unlikely(swp_type(entry) == SWP_MIGRATION_READ ||
  90.             swp_type(entry) == SWP_MIGRATION_WRITE);
  91. }
  92.  
  93. static inline int is_write_migration_entry(swp_entry_t entry)
  94. {
  95.     return unlikely(swp_type(entry) == SWP_MIGRATION_WRITE);
  96. }
  97.  
  98. static inline struct page *migration_entry_to_page(swp_entry_t entry)
  99. {
  100.     struct page *p = pfn_to_page(swp_offset(entry));
  101.     /*
  102.      * Any use of migration entries may only occur while the
  103.      * corresponding page is locked
  104.      */
  105.     BUG_ON(!PageLocked(p));
  106.     return p;
  107. }
  108.  
  109. static inline void make_migration_entry_read(swp_entry_t *entry)
  110. {
  111.     *entry = swp_entry(SWP_MIGRATION_READ, swp_offset(*entry));
  112. }
  113.  
  114. extern void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd,
  115.                     unsigned long address);
  116. #else
  117.  
  118. #define make_migration_entry(page, write) swp_entry(0, 0)
  119. static inline int is_migration_entry(swp_entry_t swp)
  120. {
  121.     return 0;
  122. }
  123. #define migration_entry_to_page(swp) NULL
  124. static inline void make_migration_entry_read(swp_entry_t *entryp) { }
  125. static inline void migration_entry_wait(struct mm_struct *mm, pmd_t *pmd,
  126.                      unsigned long address) { }
  127. static inline int is_write_migration_entry(swp_entry_t entry)
  128. {
  129.     return 0;
  130. }
  131.  
  132. #endif
  133.  
  134.